#include "playscene.h"
#include<QDebug>
#include<QMenuBar>
#include<QPainter>
#include<QTimer>
#include"mypushbutton.h"
#include<QLabel>
#include<QString>
#include<QPixmap>
#include"mycoin.h"
#include"dataconfig.h"
#include<QPropertyAnimation>
#include<QSound>

PlayScene::PlayScene(int index)
{
    //翻金币音效
     QSound *flipSound = new QSound(":/res/ConFlipSound.wav",this);
    //胜利按钮音效
     QSound *winSound = new QSound(":/res/LevelWinSound.wav",this);
    //返回按钮音效
     QSound *backSound = new QSound(":/res/BackButtonSound.wav",this);


    this->levelIndex=index;
    qDebug()<<"您进入的是第"<<this->levelIndex<<"关";
    //设置窗口尺寸
    this->setFixedSize(320,588);
    //设置标题
    this->setWindowTitle("翻金币场景");
    //设置图标
    this->setWindowIcon(QIcon("://res/Coin0001.png"));
    //创建菜单栏
    QMenuBar *bar=menuBar();
    QMenu *startMenu=bar->addMenu("开始");
    QAction * quitAction=startMenu->addAction("退出");
    connect(quitAction,&QAction::triggered,[=](){
        this->close();
    });
    //返回按钮
        MyPushButton * closeBtn = new MyPushButton(":/res/BackButton.png",":/res/BackButtonSelected.png");
        closeBtn->setParent(this);
        closeBtn->move(this->width()-closeBtn->width(),this->height()-closeBtn->height());

        //返回按钮功能实现
        connect(closeBtn,&MyPushButton::clicked,[=](){
            backSound->play();
            QTimer::singleShot(500, this,[=](){
                this->hide();
                //触发自定义信号，关闭自身，该信号写到 signals下做声明
                emit this->ChooseSceneBack();
                 }
            );
        });
        //当前关卡标题
            QLabel * label = new QLabel;
            label->setParent(this);
            QFont font;
            font.setFamily("华文新魏");
            font.setPointSize(20);
            label->setFont(font);
            QString str = QString("Level: %1").arg(this->levelIndex);
        label->setText(str);
            label->setGeometry(QRect(30,this->height() - 50, this->width(),50 ));
            label->setAttribute(Qt::WA_TransparentForMouseEvents);

            QLabel* winLabel = new QLabel;
                QPixmap pix;
                pix.load("://res/LevelCompletedDialogBg.png");
                winLabel->setGeometry(0,0,pix.width(),pix.height());
                winLabel->setPixmap(pix);
                winLabel->setParent(this);
                winLabel->move( (this->width()*0.5 - pix.width())*0.5 , -pix.height());


            //初始化二维数组
                dataConfig config;
                for(int i = 0 ; i < 4;i++)
                {
                    for(int j = 0 ; j < 4; j++)
                    {
                        this->gameArray[i][j] = config.mData[this->levelIndex][i][j];
                    }
                }


            //创建金币的背景图片
                for(int i = 0 ; i < 4;i++)
                {
                    for(int j = 0 ; j < 4; j++)
                    {
                       //绘制背景图片
                        QLabel* label = new QLabel;
                        QPixmap pix;
                        pix.load(":/res/BoardNode.png");
                        label->setGeometry(0,0,pix.width(),pix.height());
                        label->setPixmap(pix);
                        label->setParent(this);
                        label->move(57 + i*pix.width(),200+j*pix.height());
                        //金币对象
                        QString str;
                           if(this->gameArray[i][j] == 1)
                               {
                                      str = ":/res/Coin0001.png";
                                }
                                    else
                                    {
                                      str = ":/res/Coin0008.png";
                                    }

                        MyCoin * coin = new MyCoin(str);
                        coin->setParent(this);
                        coin->move(59+i*pix.width(),204+j*pix.height());
                        coin->posX = i; //记录x坐标
                        coin->posY = j; //记录y坐标
                        coin->flag =gameArray[i][j]; //记录正反标志

                        this->coinBtn[i][j]=coin;

                        //点击硬币，调用changeFlag
                        connect(coin,&MyCoin::clicked,[=](){
                            flipSound->play();
                                        coin->changeFlag();
                                        gameArray[i][j] = gameArray[i][j] == 0 ? 1 : 0;
                                        //翻转周围硬币
                                        QTimer::singleShot(300, this,[=](){
                                                            if(coin->posX+1 <=3)
                                                            {
                                                              coinBtn[coin->posX+1][coin->posY]->changeFlag();
                                                              gameArray[coin->posX+1][coin->posY] = gameArray[coin->posX+1][coin->posY]== 0 ? 1 : 0;
                                                            }
                                                            if(coin->posX-1>=0)
                                                            {
                                                              coinBtn[coin->posX-1][coin->posY]->changeFlag();
                                                              gameArray[coin->posX-1][coin->posY] = gameArray[coin->posX-1][coin->posY]== 0 ? 1 : 0;
                                                            }
                                                            if(coin->posY+1<=3)
                                                            {
                                                             coinBtn[coin->posX][coin->posY+1]->changeFlag();
                                                             gameArray[coin->posX][coin->posY+1] = gameArray[coin->posX+1][coin->posY]== 0 ? 1 : 0;
                                                            }
                                                            if(coin->posY-1>=0)
                                                            {
                                                             coinBtn[coin->posX][coin->posY-1]->changeFlag();
                                                             gameArray[coin->posX][coin->posY-1] = gameArray[coin->posX+1][coin->posY]== 0 ? 1 : 0;
                                                            }
                                                            //判断是否胜利
                                                                            this->isWin = true;
                                                                            for(int i = 0 ; i < 4;i++)
                                                                            {
                                                                                for(int j = 0 ; j < 4; j++)
                                                                                {
                                                                                    //qDebug() << coinBtn[i][j]->flag ;
                                                                                    if( this->coinBtn[i][j]->flag == false)
                                                                                    {
                                                                                        this->isWin = false;
                                                                                        break;
                                                                                    }
                                                                                }
                                                                            }
                                                                            if(this->isWin)
                                                                                   {
                                                                                          qDebug() << "胜利";
                                                                                          winSound->play();
                                                                                          for(int i = 0 ; i < 4;i++)
                                                                                          {
                                                                                              for(int j = 0 ; j < 4; j++)
                                                                                              {
                                                                                                  this->coinBtn[i][j]->isWin=true;
                                                                                              }
                                                                                          }
                                                                                         QPropertyAnimation * animation1 =  new QPropertyAnimation(winLabel,"geometry");
                                                                                          animation1->setDuration(1000);
                                                                                          animation1->setStartValue(QRect(winLabel->x(),winLabel->y(),winLabel->width(),winLabel->height()));
                                                                                          animation1->setEndValue(QRect(winLabel->x(),winLabel->y()+114,winLabel->width(),winLabel->height()));
                                                                                          animation1->setEasingCurve(QEasingCurve::OutBounce);
                                                                                          animation1->start(QAbstractAnimation::DeleteWhenStopped);

                                                                                   }
                                                                            else
                                                                            {
                                                                                for(int i = 0 ; i < 4;i++)
                                                                                {
                                                                                    for(int j = 0 ; j < 4; j++)
                                                                                    {
                                                                                        this->coinBtn[i][j]->isWin=false;
                                                                                    }
                                                                                }
                                                                            }
                                                        });



                        });




                    }
                }



}
void PlayScene::paintEvent(QPaintEvent *)
{
    //加载背景
    QPainter painter(this);
    QPixmap pix;
    pix.load(":/ne/res/86b8814c6ebb3f6a2049da8db9998356.png");
    painter.drawPixmap(0,0,this->width(),this->height(),pix);

    //加载标题
    pix.load(":/res/Title.png");
    pix = pix.scaled(pix.width()*0.5,pix.height()*0.5);
    painter.drawPixmap( 10,30,pix);
}

